/******************************************************************************
 * Qwt Widget Library
 * Copyright (C) 1997   Josef Wilgen
 * Copyright (C) 2002   Uwe Rathmann
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the Qwt License, Version 1.0
 *****************************************************************************/

#ifndef QWT_PLOT_ABSTRACT_CANVAS_H
#define QWT_PLOT_ABSTRACT_CANVAS_H

#include "qwt_global.h"
#include "qwt_plot.h"
#include <QFrame>

/*!
   \brief Base class for all type of plot canvases
 */
class QWT_EXPORT QwtPlotAbstractCanvas {
public:
  /*!
     \brief Focus indicator
     The default setting is NoFocusIndicator
     \sa setFocusIndicator(), focusIndicator(), drawFocusIndicator()
   */

  enum FocusIndicator {
    //! Don't paint a focus indicator
    NoFocusIndicator,

    /*!
       The focus is related to the complete canvas.
       Paint the focus indicator using drawFocusIndicator()
     */
    CanvasFocusIndicator,

    /*!
       The focus is related to an item (curve, point, ...) on
       the canvas. It is up to the application to display a
       focus indication using f.e. highlighting.
     */
    ItemFocusIndicator
  };

  explicit QwtPlotAbstractCanvas(QWidget *canvasWidget);
  virtual ~QwtPlotAbstractCanvas();

  QwtPlot *plot();
  const QwtPlot *plot() const;

  void setFocusIndicator(FocusIndicator);
  FocusIndicator focusIndicator() const;

  void setBorderRadius(double);
  double borderRadius() const;

protected:
  QWidget *canvasWidget();
  const QWidget *canvasWidget() const;

  virtual void drawFocusIndicator(QPainter *);
  virtual void drawBorder(QPainter *);
  virtual void drawBackground(QPainter *);

  void fillBackground(QPainter *);
  void drawCanvas(QPainter *);
  void drawStyled(QPainter *, bool);
  void drawUnstyled(QPainter *);

  QPainterPath canvasBorderPath(const QRect &rect) const;
  void updateStyleSheetInfo();

private:
  Q_DISABLE_COPY(QwtPlotAbstractCanvas)

  class PrivateData;
  PrivateData *m_data;
};

/*!
   \brief Base class of QwtPlotOpenGLCanvas and QwtPlotGLCanvas
 */
class QWT_EXPORT QwtPlotAbstractGLCanvas : public QwtPlotAbstractCanvas {
public:
  /*!
     \brief Paint attributes

     The default setting enables BackingStore and Opaque.

     \sa setPaintAttribute(), testPaintAttribute()
   */
  enum PaintAttribute {
    /*!
       \brief Paint double buffered reusing the content
             of the pixmap buffer when possible.

       Using a backing store might improve the performance
       significantly, when working with widget overlays ( like rubber bands ).
       Disabling the cache might improve the performance for
       incremental paints (using QwtPlotDirectPainter ).

       \sa backingStore(), invalidateBackingStore()
     */
    BackingStore = 1,

    /*!
       When ImmediatePaint is set replot() calls repaint()
       instead of update().

       \sa replot(), QWidget::repaint(), QWidget::update()
     */
    ImmediatePaint = 8,
  };

  //! Paint attributes
  Q_DECLARE_FLAGS(PaintAttributes, PaintAttribute)

  explicit QwtPlotAbstractGLCanvas(QWidget *canvasWidget);
  virtual ~QwtPlotAbstractGLCanvas();

  void setPaintAttribute(PaintAttribute, bool on = true);
  bool testPaintAttribute(PaintAttribute) const;

  void setFrameStyle(int style);
  int frameStyle() const;

  void setFrameShadow(QFrame::Shadow);
  QFrame::Shadow frameShadow() const;

  void setFrameShape(QFrame::Shape);
  QFrame::Shape frameShape() const;

  void setLineWidth(int);
  int lineWidth() const;

  void setMidLineWidth(int);
  int midLineWidth() const;

  int frameWidth() const;
  QRect frameRect() const;

  //! Invalidate the internal backing store
  virtual void invalidateBackingStore() = 0;

protected:
  void replot();
  void draw(QPainter *);

private:
  virtual void clearBackingStore() = 0;

  class PrivateData;
  PrivateData *m_data;
};

Q_DECLARE_OPERATORS_FOR_FLAGS(QwtPlotAbstractGLCanvas::PaintAttributes)

#endif
